/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package packetTracker;

import beans.Mapa;
import beans.Pedido;
import beans.PedidoBD;
import beans.Punto;
import config.Parameters;
import config.Reloj;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Shadow
 */
public class Dispatcher {

    public static int idPedidoInt;
    private static ArrayList<Pedido> _pedidos = new ArrayList<>();
    private static ArrayList<PedidoBD> pedidosBD = new ArrayList<>();
    private static int idPedido = 1;
    private static int pedidosDia;

    public static void leerBloqueos() {
        BufferedReader r = null;
        try {
            String ruta = PacketTracker.getInstancia().getServletContext().getRealPath("") + "/WEB-INF/files/" + "bloqueados.txt";
            r = new BufferedReader(new FileReader(ruta));
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Dispatcher.class.getName()).log(Level.SEVERE, null, ex);
            return;
        }
        String line = null;
        String[] toks;
        int x = 0, y = 0, nPaq = 0, idCliente = 0, tiempoEntrega = 0;
        ArrayList<Pedido> grafo = new ArrayList<>();
        while (true) {
            try {
                line = r.readLine();
            } catch (IOException ex) {
                Logger.getLogger(Dispatcher.class.getName()).log(Level.SEVERE, null, ex);
                return;
            }
            if (line == null || line.length() == 0) {
                break;
            }
            toks = line.split(",");
            x = Integer.parseInt(toks[0]);
            y = Integer.parseInt(toks[1]);
            Mapa.getPunto(x, y).bloquear();
            Parameters.getListaBloqueo().add(Mapa.getPunto(x, y));            
        }
    }

    public static boolean leerEventosDiaConfig(String dia, String mes, String anho) {
        BufferedReader r = null;
        try {
            String ruta = PacketTracker.getInstancia().getServletContext().getRealPath("") + "/WEB-INF/files/" + "dat" + anho + mes + dia + ".txt";
            r = new BufferedReader(new FileReader(ruta));
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Dispatcher.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
        int i = 0;
        String line = null;
        pedidosDia = 0;
        String[] toks;
        int x = 0, y = 0, nPaq = 0, idCliente = 0, tiempoEntrega = 0;
        ArrayList<Pedido> grafo = new ArrayList<>();
        while (true) {
            try {
                line = r.readLine();
            } catch (IOException ex) {
                Logger.getLogger(Dispatcher.class.getName()).log(Level.SEVERE, null, ex);
                return false;
            }
            if (line == null || line.length() == 0) {
                break;
            }
            toks = line.split(",");
            String hora = toks[0];
            x = Integer.parseInt(toks[1]);
            y = Integer.parseInt(toks[2]);
            nPaq = Integer.parseInt(toks[3]);
            idCliente = Integer.parseInt(toks[4]);
            tiempoEntrega = Integer.parseInt(toks[5]);
            Calendar fechaPedido = (Calendar) Calendar.getInstance().clone();
            fechaPedido.set(Integer.parseInt(anho), Integer.parseInt(mes) - 1, Integer.parseInt(dia), Integer.parseInt(hora.substring(0, 2)), Integer.parseInt(hora.substring(3, 5)));
            Pedido pedido = new Pedido(x, y, nPaq, tiempoEntrega, fechaPedido, idPedidoInt++, "Pendiente");
            pedidosDia += pedido.getDemanda();
            if ((nPaq > 0) && (noBloqueado(pedido))) //Se pone solo para evitar problemas del archivo generado
            {
                grafo.add(pedido);
            }
        }
        _pedidos.addAll(grafo);
        for (int j = 0; j < _pedidos.size(); j++) {
            PedidoBD pdBD = new PedidoBD(_pedidos.get(j).getIdPedido());
            pedidosBD.add(pdBD);
        }
        return true;
    }

    static boolean leerEventosDia(String dia, String mes, String anho) {
        BufferedReader r = null;
        try {
            String ruta = PacketTracker.getInstancia().getServletContext().getRealPath("") + "/WEB-INF/files/" + "dat" + anho + mes + dia + ".txt";
            r = new BufferedReader(new FileReader(ruta));
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Dispatcher.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
        int i = 0;
        String line = null;
        String[] toks;
        pedidosDia = 0;
        int x = 0, y = 0, nPaq = 0, idCliente = 0, tiempoEntrega = 0;
        ArrayList<Pedido> grafo = new ArrayList<>();
        while (true) {
            try {
                line = r.readLine();
            } catch (IOException ex) {
                Logger.getLogger(Dispatcher.class.getName()).log(Level.SEVERE, null, ex);
                return false;
            }
            if (line == null || line.length() == 0) {
                break;
            }
            toks = line.split(",");
            String hora = toks[0].trim();
            x = Integer.parseInt(toks[1]);
            y = Integer.parseInt(toks[2]);
            nPaq = Integer.parseInt(toks[3]);
            idCliente = Integer.parseInt(toks[4]);
            tiempoEntrega = Integer.parseInt(toks[5]);
            Calendar fechaPedido = (Calendar) Calendar.getInstance().clone();
            fechaPedido.clear();
            fechaPedido.set(Integer.parseInt(anho), Integer.parseInt(mes) - 1, Integer.parseInt(dia), Integer.parseInt(hora.substring(0, 2)), Integer.parseInt(hora.substring(3, 5)));
            fechaPedido.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hora.substring(0, 2)));
            fechaPedido.set(Calendar.MINUTE, Integer.parseInt(hora.substring(3, 5)));
            Pedido pedido = new Pedido(x, y, nPaq, tiempoEntrega, fechaPedido, idPedidoInt++, "Pendiente");//////////IDPEDIDOOOOOOO
            if ((nPaq > 0) && noBloqueado(pedido)) //Se pone solo para evitar problemas del archivo generado
            {
                grafo.add(pedido);
            }
            pedidosDia += pedido.getDemanda();
        }
        _pedidos.addAll(grafo);
        for (int j = 0; j < _pedidos.size(); j++) {
            PedidoBD pdBD = new PedidoBD(_pedidos.get(j).getIdPedido());
            pedidosBD.add(pdBD);
        }
        return true;
    }

    static ArrayList<Pedido> siguientesPedidos(int hora, int minuto) {
        Reloj reloj = Reloj.getInstancia();
        ArrayList<Pedido> pedidosSiguientes = new ArrayList<>();
        for (Pedido pedido : _pedidos) {
            if (pedido.getHoraPedido() * 60 + pedido.getMinutoPedido() <= hora * 60 + minuto) {
                pedidosSiguientes.add(pedido);
                boolean encontrado = false;
                int index = -1;
                while (!encontrado) {
                    index++;
                    if (Dispatcher.getPedidosBD().get(index).getIdPedido() == pedido.getIdPedido()) {
                        encontrado = true;
                    }
                }
                if (encontrado) {
                    Dispatcher.getPedidosBD().get(index).setEstado(1);
                }
            }
        }
        _pedidos.removeAll(pedidosSiguientes);
        return pedidosSiguientes;
    }

    static boolean finPedidos() {
        return _pedidos.isEmpty();
    }

    static ArrayList<Pedido> getColaPedidos() {
        return _pedidos;
    }

    /**
     * @return the pedidosBD
     */
    public static ArrayList<PedidoBD> getPedidosBD() {
        return pedidosBD;
    }

    /**
     * @param aPedidosBD the pedidosBD to set
     */
    public static void setPedidosBD(ArrayList<PedidoBD> aPedidosBD) {
        pedidosBD = aPedidosBD;
    }

    private static boolean noBloqueado(Pedido pedido) {
        ArrayList<Punto> bloqueos = Parameters.getListaBloqueo();
        Punto posicionPedido = pedido.getDestino();
        return ! bloqueos.contains(posicionPedido);
        
    }
}
